﻿using CentralVacuum.Common;
using Sunny.UI;
using System;
using CentralVacuum.Properties;
using System.Diagnostics;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;
using CentralVacuum.SqlSugarService;
using CentralVacuum.Models;
using System.IO;
using HslCommunication.LogNet;
using CentralVacuum.Mqtt;
using System.Linq;

namespace CentralVacuum
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            //利用Mutex互斥对象防止程序多开
            _ = new Mutex(true, Process.GetCurrentProcess().ProcessName, out bool isAppRunning);
            if (!isAppRunning)
            {
                UIMessageTip.ShowError("The program is already running!");
                Environment.Exit(1);
            }
            //语言切换
            if (Settings.Default.Language == 0)//中文
            {
                LanguageRESX.Resource_zh_CN();

            }
            else if (Settings.Default.Language == 1)//英文
            {
                LanguageRESX.Resource_en_US();
            }

            //判断配方文件夹是否存在
            if (!Directory.Exists(@"C:\FangYuanData\Recipes"))
            {
                Directory.CreateDirectory(@"C:\FangYuanData\Recipes");//不存在就创建文件夹
            }
            //判断数据库日志文件夹是否存在
            if (!Directory.Exists(@"C:\FangYuanData\Datas"))
            {
                Directory.CreateDirectory(@"C:\FangYuanData\Datas");//不存在就创建文件夹
            }
            //判断日志文件夹是否存在
            if (!Directory.Exists(@"C:\FangYuanData\Logs"))
            {
                Directory.CreateDirectory(@"C:\FangYuanData\Logs");//不存在就创建文件夹
            }
            //读取许可证信息,授权软件运行
            string lic = @"C:\FangYuanData\license.lic";
            if (!File.Exists(lic))//不存在文件
            {
                //string a = "PN:" + Global.GetCpuInfo() + "." + Global.GetHDid() + "." + Global.GetMoAddress();
                IniFile inilic = new IniFile(lic);
                inilic.Write("License", "Encrypted", "");//
                inilic.Write("License", "Key", "");//
                inilic.Write("License", "IV", "");//

                inilic.UpdateFile();
            }
            //配置文件
            if (!File.Exists(@"C:\FangYuanData\PN.ini"))//不存在文件
            {
                IniFile ini = new IniFile(@"C:\FangYuanData\PN.ini");
                ini.Write("System", "PN", Global.GetCpuInfo());//PN码供远程使用，跟授权无关

                ini.UpdateFile();
            }
            //配置文件
            if (!File.Exists(@"C:\FangYuanData\Setting.ini"))//不存在文件
            {
                IniFile ini = new IniFile(@"C:\FangYuanData\Setting.ini");
                ini.Write("System", "Appliance", "Server");//"server"配置为服务端（本地端），"client"配置为客服端（远程端）
                ini.Write("Company", "CompanyName", "杭州方圆塑机股份有限公司");//报表抬头的信息
                ini.Write("Login", "LoginPassword", "123456");//登录权限的信息
                ini.Write("Help", "Url", "https://blog.csdn.net/qq_30676041/article/details/133550886");//帮助文档地址
                ini.Write("IPC", "Ip", "10.10.150.1");//PLC的IP地址信息
                ini.Write("IPC", "Port", "1025");//PLC的端口信息
                ini.Write("Mqtt", "Ip", "60.191.66.212");//MQTT的IP信息，内网访问172.28.1.153
                ini.Write("Mqtt", "Port", "1883");//MQTT的端口信息
                ini.Write("Mqtt", "User", "admin");//MQTT的用户名
                ini.Write("Mqtt", "Password", "123456");//MQTT的密码

                ini.UpdateFile();
            }
            //日志存储文件
            Global.LogNet = new LogNetDateTime(@"C:\FangYuanData\Logs", GenerateMode.ByEveryDay, 30);//最多存储30天的文件
            
            // English For example
            if (HslCommunication.Authorization.SetAuthorizationCode("78bbfbf3-8f22-4bb6-a4a5-01f228c43e9e") && HslControls.Authorization.SetAuthorizationCode("40e2fd08-7df9-4892-9700-09cf1a0d3d7c"))//V11.7.0 && V3.4.0
            {
                //HslDeltaSerial.OpenConnect(); //台达通讯实例化
                //HslMelsecMCBinary.OpenConnect(); //三菱5U通讯实例化
                UIMessageTip.ShowOk("System kernel activation successful!");
                Global.LogNet.WriteInfo("Program", "System kernel activation successful!");
            }
            else
            {
                //UIMessageTip.ShowError("Active Failed! it can only use 24 hours!");
                UIMessageDialog.ShowMessageDialog("Active Failed! it can only use 24 hours!", UILocalize.ErrorTitle, false, UIStyle.Red);
                Global.LogNet.WriteFatal("Program", "Active Failed! it can only use 24 hours!");
                return;  // quit if active failed
            }
            
            Global.rData = new Register();//初始化PLC寄存器数据
            Global.rMQTTData = new Register();//初始化MQTT寄存器数据
            /*
            //创建数据库，不存在：创建，  存在：不会重复创建
            //会根据连接字符串中的数据库进行创建
            var db = SqlSugarHelper.Db;
            //建库：如果不存在创建数据库存在不会重复创建 
            db.DbMaintenance.CreateDatabase(); // 注意 ：Oracle和个别国产库需不支持该方法，需要手动建库 
            //创建表：根据实体类CodeFirstTable1  (所有数据库都支持)    
            db.CodeFirst.InitTables(typeof(PLog));//这样一个表就能成功创建了 
            */

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FCustomGlobal());
        }
    }
}
